﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
//
//int tab(int year, int i)
//{
//    static int monthDayArray[13] = { -1 , 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//    //判断闰年
//    if ((i == 2) && ((year % 4 == 0 && year % 100 != 0)
//        || (year % 400 == 0)))
//    {
//        return 29;
//    }
//    //返回天数
//    return monthDayArray[i];
//}
//bool add(int year, int month, int day, int _year, int _month, int _day)
//{
//    if (year != _year)
//    {
//        return true;
//    }
//    else if (year == _year && month != _month)
//    {
//        return true;
//    }
//    else if (year == _year && month == _month && day != _day)
//    {
//        return true;
//    }
//    return false;
//}
//
//int main() {
//    int year, month, day;
//    int _year, _month, _day;
//    while (cin >> year >> month >> day >> _year >> _month >> _day) { // 注意 while 处理多个 case
//        int n = 0;
//        while (add(year, month, day, _year, _month, _day))
//        {
//            ++day;
//            ++n;
//            //判断日
//            if (day > tab(year, month))
//            {
//                month++;
//                day = 1;
//                //判断月
//                if (month == 13)
//                {
//                    year++;
//                    month = 1;
//                }
//            }
//        }
//        n++;
//        cout << n << endl;
//    }
//}


//#include<iostream>
//using namespace std;
//class Date
//{
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	// void Print(const Date* const this) const
//
//	void Print() const
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//
//
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	// 这⾥⾮const对象也可以调⽤const成员函数是⼀种权限的缩⼩
//	Date d1(2024, 7, 5);
//	d1.Print();
//
//	const Date d2(2024, 8, 5);
//	d2.Print();
//
//	return 0;
//}

typedef int STDataType;

class Stack
{
public:
	Stack(int n)
	{
		_a = (STDataType*)malloc(sizeof(STDataType) * n);
		if (nullptr == _a)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = n;
		_top = 0;
	}

private:
	STDataType* _a;
	size_t _capacity;
	size_t _top;
};

// 两个Stack实现队列
class MyQueue
{
public:

	//编译器默认生成MyQueue的构造函数调用了Stack的默认构造，完成了两个成员的初始化
	// 如果栈没有默认构造
	MyQueue(int n = 10)
		//初始化列表
		:_pushst(10)
		
		,a(n)// error C2530 : “Date::a” : 必须初始化引⽤
	{

	}

private:
	// 注意这⾥不是初始化，这⾥给的是缺省值，这个缺省值是给初始化列表的
    // 如果初始化列表没有显⽰初始化，默认就会⽤这个缺省值初始化
	Stack _pushst = 10;
	Stack _popst = 10;

	const int b = 5;
	int c = 8;
	int& a;
};
   

//class Time
//{
//public:
//	Time(int hour)
//		:_hour(hour)
//	{
//		cout << "Time()" << endl;
//	}
//private:
//	int _hour;
//};
//
//
//
//class Date
//{
//public:
//	Date(int& x, int year = 1, int month = 1, int day = 1)
//		:_year(year)
//		, _month(month)
//
//		, _ref(x)
//
//	{
//
//	}
//	void Print() const
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//
//	Time _t; // 没有默认构造
//	int& _ref; // 引用
//	const int _n; // const
//};
//
//
//int main()
//{
//	int i = 0;
//	// 对象整体
//
//	//const int j = 1;
//	 d1;
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//class A
//{
//public:
//	A(int a)
//		:_a1(a)
//		,_a2(_a1)
//	{}
//
//	void Print() {
//		cout << _a1 << " " << _a2 << endl;
//	}
//
//private:
//	int _a2 = 2;
//	int _a1 = 2;
//};
//
//int main()
//{
//	A aa(1);
//	aa.Print();
//}

#include<iostream>
using namespace std;
class A
{
public:
	// 构造函数explicit就不再⽀持隐式类型转换
	// explicit A(int a1)
	 A(int a1)
		:_a1(a1)
	{
		cout << "构造函数:A(int a1)" <<endl;
	}

	//拷贝构造
	A(const A& d)
		:_a1(d._a1)
		,_a2(d._a2)
	{
		cout << "拷贝构造:A(const A& d)" << endl;
	}

	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}

	A(int a1, int a2)
		:_a1(a1)
		, _a2(a2)
	{}

private:
	int _a1 = 1;
	int _a2 = 99;
};

int main()
{
	// 1构造⼀个A的临时对象，再⽤这个临时对象拷⻉构造aa3
	// 编译器遇到连续构造+拷⻉构造->优化为直接构造
	/*A aa1 = 1;
	aa1.Print();

	const A& aa2 = 1;*/

	A aa3 = { 2,2 };


	return 0;
}